<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:ex="http://exslt.org/dates-and-times"
	>
	<xsl:output method="text"/>
	<xsl:template match="/">
		<xsl:text>--Creator:		mysql2sqlite.xslt
--Created:		</xsl:text>
		<xsl:value-of select="ex:date-time()"/>
<xsl:apply-templates select="//database"/>
	</xsl:template>

	<xsl:template match="table_structure">
		<!-- create table -->
		<xsl:text>
--Table </xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>
DROP TABLE IF EXISTS &quot;</xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>&quot;;</xsl:text>
		<xsl:text>
CREATE TABLE &quot;</xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>&quot;(
</xsl:text>
		<xsl:for-each select="field">
			<xsl:text>	&quot;</xsl:text>
			<xsl:value-of select="@Field"/>
			<xsl:text>&quot;</xsl:text>
			<xsl:text> </xsl:text>
			<xsl:apply-templates select="@Type"/>
			<xsl:apply-templates select="@Key"/>
			<xsl:apply-templates select="@Extra"/>
			<xsl:apply-templates select="@Null"/>
			<xsl:apply-templates select="@Default"/>
			<xsl:if test="position()!=last()">
				<xsl:text>,
</xsl:text>
			</xsl:if>
		</xsl:for-each>
		<xsl:if test="./key[@Key_name='PRIMARY' and @Seq_in_index=2]">
			<xsl:apply-templates select="key[@Non_unique = '0' and @Seq_in_index = '1' and @Key_name = 'PRIMARY']"/>
		</xsl:if>
		<xsl:apply-templates select="key[@Non_unique = '0' and @Seq_in_index = '1' and @Key_name != 'PRIMARY']"/>
		<xsl:text>
);</xsl:text>
		<xsl:apply-templates select="key[@Non_unique = '1' and @Seq_in_index = '1']"/>
	</xsl:template>
	
	<xsl:template match="//database/table_structure/key">
		<xsl:if test="@Seq_in_index != '1'">
			<xsl:text>,&quot;</xsl:text>
			<xsl:value-of select="@Column_name"/>
			<xsl:text>&quot;</xsl:text>
		</xsl:if>
		<xsl:if test="@Seq_in_index = '1'">
			<xsl:choose>
				<xsl:when test="@Non_unique = '1'">
					<xsl:text>
CREATE INDEX &quot;</xsl:text>
				</xsl:when>
				<xsl:when test="@Non_unique = '0' and @Key_name != 'PRIMARY'">
					<xsl:text>,
	CONSTRAINT &quot;</xsl:text>
				</xsl:when>
				<xsl:when test="@Non_unique = '0' and @Key_name = 'PRIMARY'">
					<xsl:text>,
	PRIMARY KEY (&quot;</xsl:text>
				</xsl:when>
			</xsl:choose>
			<xsl:if test="@Key_name != 'PRIMARY'">
				<xsl:value-of select="@Table"/>
				<xsl:text>.</xsl:text>
				<xsl:value-of select="@Key_name"/>
				<xsl:choose>
					<xsl:when test="@Non_unique = '1'">
						<xsl:text>&quot; ON &quot;</xsl:text>
						<xsl:value-of select="@Table"/>
						<xsl:text>&quot;(&quot;</xsl:text>
					</xsl:when>
					<xsl:when test="@Non_unique = '0'">
						<xsl:text>&quot; UNIQUE(&quot;</xsl:text>
					</xsl:when>
				</xsl:choose>
			</xsl:if>
			<xsl:value-of select="@Column_name"/>
			<xsl:text>&quot;</xsl:text>
			<xsl:variable name="kn" select="@Key_name"/>
			<xsl:apply-templates select="../key[@Key_name = $kn and @Seq_in_index != '1']"/>
			<xsl:text>)</xsl:text>
			<xsl:if test="@Non_unique = '1'">
				<xsl:text>;</xsl:text>
			</xsl:if>
		</xsl:if>
	</xsl:template>

	<xsl:template match="@Type">
		<xsl:choose>
			<xsl:when test="starts-with(., 'int') or starts-with(., 'smallint') or starts-with(., 'tinyint')">integer</xsl:when>
			<xsl:when test="starts-with(., 'enum(')">char(30)</xsl:when>
			<xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
		</xsl:choose>	
	</xsl:template>

	<xsl:template match="@Null">
		<xsl:if test="current() = 'NO'"> NOT NULL</xsl:if>
		<xsl:if test="current() = 'YES'"> NULL</xsl:if>
	</xsl:template>

	<xsl:template match="@Key">
		<xsl:if test=". = 'PRI' and not(../../key[@Key_name='PRIMARY' and @Seq_in_index=2])"> PRIMARY KEY</xsl:if>
	</xsl:template>

	<xsl:template match="@Extra">
		<xsl:if test=". = 'auto_increment' and ../@Key = 'PRI'"> AUTOINCREMENT</xsl:if>
	</xsl:template>

	<xsl:template match="@Default">
		<xsl:text> default </xsl:text>
		<xsl:call-template name="typedValue">
			<xsl:with-param name="type" select="../@Type"/>
			<xsl:with-param name="value" select="."/>
		</xsl:call-template>
	</xsl:template>

	<xsl:template match="table_data">
		<xsl:variable name="curtab" select="@name"/>
		<xsl:for-each select="row">
			<xsl:text>
INSERT INTO &quot;</xsl:text>
			<xsl:value-of select="$curtab"/>
			<xsl:text>&quot;(</xsl:text>
			<xsl:for-each select="field">
				<xsl:text>&quot;</xsl:text>
				<xsl:value-of select="@name"/>
				<xsl:text>&quot;</xsl:text>
				<xsl:if test="position()!=last()">
					<xsl:text>,</xsl:text>
				</xsl:if>
			</xsl:for-each>
		<xsl:text>) VALUES (</xsl:text>
		<xsl:apply-templates select="./field"/>
		<xsl:text>);</xsl:text>
		</xsl:for-each>
	</xsl:template>
	
	<xsl:template match="//table_data/row/field">
		<xsl:variable name="tbl" select="../../@name"/>
		<xsl:variable name="fld" select="@name"/>
		
		<xsl:variable name="tp" select="//table_structure[@name=$tbl]/field[@Field=$fld]/@Type"/>
		<!-- xsl:message>tp[<xsl:value-of select="$tbl"/>,<xsl:value-of select="$fld"/>]=<xsl:value-of 
			select="//table_structure[@name=$tbl]/field[@Field=$fld]/@Type"/> vs <xsl:value-of select="$tp"/></xsl:message-->
		<xsl:call-template name="typedValue">
			<xsl:with-param name="type" select="$tp"/>
			<xsl:with-param name="value" select="."/>
		</xsl:call-template>
		
		<!--xsl:choose>
			<xsl:when test="starts-with($tp, 'int') or starts-with($tp, 'float') or starts-with($tp, 'number')"><xsl:value-of select="."/></xsl:when>
			<xsl:when test="$tp = 'blob'">X'<xsl:value-of select="."/>'</xsl:when>
			<xsl:when test="starts-with($tp, 'char') or starts-with($tp, 'varchar') or $tp = 'text'">'<xsl:call-template 
				name="processString"><xsl:with-param name="str" select="."/>
			</xsl:call-template>'</xsl:when>
			<xsl:otherwise>'<xsl:value-of select="."/>'</xsl:otherwise>
		</xsl:choose-->	
		<xsl:if test="position()!=last()">,</xsl:if>
	</xsl:template>
	
	<xsl:template name="string-replace-all">
    <xsl:param name="text" />
    <xsl:param name="replace" />
    <xsl:param name="by" />
	    <xsl:choose>
	      <xsl:when test="contains($text, $replace)">
	        <xsl:value-of select="substring-before($text,$replace)" />
	        <xsl:value-of select="$by" />
	        <xsl:call-template name="string-replace-all">
	          <xsl:with-param name="text"
	          select="substring-after($text,$replace)" />
	          <xsl:with-param name="replace" select="$replace" />
	          <xsl:with-param name="by" select="$by" />
	        </xsl:call-template>
	      </xsl:when>
	      <xsl:otherwise>
	        <xsl:value-of select="$text" />
	      </xsl:otherwise>
	    </xsl:choose>
	</xsl:template>
  
	<xsl:template name="processString">
	<xsl:param name="str"/>
		<xsl:call-template name="string-replace-all">
		<xsl:with-param name="text">
			<xsl:call-template name="string-replace-all">
			<xsl:with-param name="text">
				<xsl:call-template name="string-replace-all">
				<xsl:with-param name="text">
					<xsl:call-template name="string-replace-all">
					<xsl:with-param name="text" select="$str"/>
					<xsl:with-param name="replace">\n</xsl:with-param>
					<xsl:with-param name="by">&#x0A;</xsl:with-param>
					</xsl:call-template>	
				</xsl:with-param>
				<xsl:with-param name="replace">\r</xsl:with-param>
				<xsl:with-param name="by">&#x0D;</xsl:with-param>
				</xsl:call-template>	
			</xsl:with-param>
			<xsl:with-param name="replace">\&quot;</xsl:with-param>
			<xsl:with-param name="by">&quot;</xsl:with-param>
			</xsl:call-template>	
		</xsl:with-param>
		<xsl:with-param name="replace">\'</xsl:with-param>
		<xsl:with-param name="by">''</xsl:with-param>
		</xsl:call-template>	
	</xsl:template>
	
	<xsl:template name="typedValue" >
	<xsl:param name="type"/>
	<xsl:param name="value"/>
		<xsl:choose>
			<xsl:when test="$type = 'double' or $type = 'float' or starts-with($type,'int') or starts-with($type,'numeric') or starts-with($type,'decimal') or starts-with($type,'tinyint') or starts-with($type,'smallint')">
				<xsl:choose>
					<xsl:when test="$value = ''">null</xsl:when>
					<xsl:otherwise><xsl:value-of select="$value"/></xsl:otherwise>
				</xsl:choose>
			</xsl:when>
			<xsl:when test="starts-with($type, 'char') or starts-with($type, 'varchar') or $type = 'text'">'<xsl:call-template 
				name="processString"><xsl:with-param name="str" select="$value"/>
			</xsl:call-template>'</xsl:when>
			<xsl:when test="$type='blob'">X'<xsl:value-of select="$value"/>'</xsl:when>
			<xsl:otherwise>'<xsl:value-of select="$value"/>'</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

</xsl:stylesheet>